package com.song.tools.trigger;

import jakarta.annotation.PostConstruct;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.lang.NonNull;

import java.util.Objects;

/**
 * 抽象触发器模版
 *
 * @author song tools
 * @since 2024-07-19
 */
@Getter
@Slf4j
public abstract class AbstractTriggerTemplate<TriggerRequest, TriggerResponse> implements Trigger<TriggerRequest, TriggerResponse> {

    /**
     * 触发器类型
     */
    private final TriggerType triggerType;

    public AbstractTriggerTemplate(@NonNull TriggerType triggerType) {
        Objects.requireNonNull(triggerType);
        this.triggerType = triggerType;
    }

    /**
     * 前置操作
     *
     * @param triggerContext 请求上下文
     */
    protected void before(TriggerContext<TriggerRequest> triggerContext) {
    }

    /**
     * 后置操作
     *
     * @param triggerContext  请求上下文
     * @param triggerResponse 触发器响应
     */
    protected void after(TriggerContext<TriggerRequest> triggerContext, TriggerResponse triggerResponse) {
    }

    /**
     * 执行
     *
     * @param triggerContext 请求上下文
     * @return 触发器响应
     */
    @SuppressWarnings("unchecked")
    public final TriggerResponse execute(TriggerContext<TriggerRequest> triggerContext) {
        AbstractTriggerTemplate<TriggerRequest, TriggerResponse> triggerTemplate = SpringBeanUtil.getByClass(this.getClass());

        // 执行前置操作
        triggerTemplate.before(triggerContext);
        // 触发器执行
        TriggerResponse triggerResponse = triggerTemplate.trigger(triggerContext);
        // 执行后置操作
        triggerTemplate.after(triggerContext, triggerResponse);

        // 返回响应
        return triggerResponse;
    }

    @PostConstruct
    private void registerTrigger() {
        log.info("注册触发器{}：triggerType.code={},triggerType.desc={}", this.getClass(), triggerType.getCode(), triggerType.getDesc());
        TriggerFactory.register(triggerType, this);
    }
}
